<!DOCTYPE html>
<html class="client-nojs vector-feature-language-in-header-enabled vector-feature-language-in-main-page-header-disabled vector-feature-page-tools-pinned-disabled vector-feature-toc-pinned-clientpref-0 vector-toc-not-available vector-feature-main-menu-pinned-disabled vector-feature-limited-width-clientpref-1 vector-feature-limited-width-content-enabled vector-feature-custom-font-size-clientpref-1 vector-feature-appearance-pinned-clientpref-0 vector-feature-night-mode-enabled skin-theme-clientpref-os vector-sticky-header-enabled" lang="fr" dir="ltr"><head>
<meta charset="UTF-8">
<title>XQuery</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="icon" type="image/png" href="./_res_/favicon.png">
<link rel="canonical" href="https://fr.wikipedia.org/wiki/XQuery"> <link href="./_mw_/ext.pygments.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.wikimediamessages.styles.css" rel="stylesheet" type="text/css">
<link href="./_mw_/skins.vector.icons.css" rel="stylesheet" type="text/css">
<link href="./_mw_/skins.vector.search.codex.styles.css" rel="stylesheet" type="text/css">
<link href="./_mw_/skins.vector.styles.css" rel="stylesheet" type="text/css">
<meta name="ResourceLoaderDynamicStyles" content="">
<link rel="stylesheet" type="text/css" href="./_mw_/site.styles.css">
<link rel="stylesheet" type="text/css" href="./_mw_/noscript.css">
<link rel="stylesheet" type="text/css" href="./_res_/footer.css">
<link rel="stylesheet" type="text/css" href="./_res_/vector-2022.css">
</head>
<body class="skin--responsive skin-vector skin-vector-search-vue mediawiki ltr sitedir-ltr mw-hide-empty-elt ns-0 ns-subject page-XQuery rootpage-XQuery skin-vector-2022 action-view">
<div class="mw-page-container">
<div class="mw-page-container-inner">
<div class="mw-content-container">
<main id="content" class="mw-body">
<header class="mw-body-header vector-page-titlebar">
<h1 id="firstHeading" class="firstHeading mw-first-heading"><span class="mw-page-title-main">XQuery</span></h1>
</header>
<a id="top"></a>
<div id="bodyContent" class="vector-body ve-init-mw-desktopArticleTarget-targetContainer" aria-labelledby="firstHeading" data-mw-ve-target-container="">
<div id="contentSub">
<div id="mw-content-subtitle"></div>
</div>
<div id="mw-content-text" class="mw-body-content mw-content-ltr" lang="fr" dir="ltr"><div class="mw-content-ltr mw-parser-output" lang="fr" dir="ltr"><p class="mw-empty-elt">
</p>
<table class="infobox_v2 infobox infobox--frwiki noarchive">
<tbody><tr>
<td colspan="2" class="entete informatique" style="background-color:#EEEEEE;color:black;">XQuery<style data-mw-deduplicate="TemplateStyles:r228712691">
/* start https://fr.wikipedia.org/ */
.mw-parser-output .entete.informatique{background-image:url("./_mw_/Picto.nfo.png")}
/* end https://fr.wikipedia.org/ */
</style>
</td></tr>
<tr><th scope="row">Date de première version
</th>
<td><span class="wd_p571"><time datetime="2007" data-sort-value="2007" class="date-lien"><a href="2007" title="2007">2007</a></time></span>
</td>
</tr>
<tr>
<th scope="row"><a href="Site_web" title="Site web">Site web</a>
</th>
<td><span class="wd_p856"><a rel="nofollow" class="external text" href="http://www.w3.org/XML/Query/">www.w3.org/XML/Query</a></span>
</td>
</tr>
<tr>
</tr>
</tbody></table>
<p><b>XQuery</b> est un <a href="Langage_de_requ%C3%AAte" title="Langage de requête">langage de requête</a> informatique permettant non seulement d'extraire des informations d'un document <a href="Extensible_Markup_Language" title="Extensible Markup Language">XML</a>, ou d'une collection de documents XML, mais également d'effectuer des calculs complexes à partir des informations extraites et de reconstruire de nouveaux documents ou fragments XML.
</p><p>XQuery est une spécification du <a href="World_Wide_Web_Consortium" title="World Wide Web Consortium">W3C</a> dont la version 1.0 finale date de <time class="nowrap" datetime="2007-01" data-sort-value="2007-01">janvier 2007</time>, et dont l'élaboration a demandé près de huit années. XQuery a été développé conjointement avec XSLT 2, une révision majeure du <a href="Langage_de_transformation_XML" title="Langage de transformation XML">langage de transformation XML</a> <a href="XSLT" class="mw-redirect" title="XSLT">XSLT</a>, avec lequel il partage le sous-ensemble XPath 2.0 <a href="https://en.wikipedia.org/wiki/XPath_2.0" class="extiw external" title="en:XPath 2.0"><span class="indicateur-langue" title="Article en anglais : « XPath 2.0 »">(en)</span></a>.
</p><p>XQuery joue par rapport aux données XML un rôle similaire à celui du langage <a href="Structured_Query_Language" title="Structured Query Language">SQL</a> vis-à-vis des données relationnelles, et l'on peut trouver des analogies entre ces deux langages.
</p>
<div class="mw-heading mw-heading2"><h2 id="Syntaxes">Syntaxes</h2></div>
<p>Il existe deux syntaxes distinctes pour XQuery :
</p>
<ul><li>la syntaxe "naturelle" non-XML dite aussi <b>FLWOR</b> (prononcer flower), dont le nom vient des cinq clauses principales qui la composent (<i><tt>for</tt></i>, <i><tt>let</tt></i>, <i><tt>where</tt></i>, <i><tt>order by</tt></i> et <i><tt>return</tt></i>) ;</li>
<li>la syntaxe <b>XQueryX</b> (pour « XML Syntax for XQuery »), dans laquelle une requête est un document XML. De ce fait, elle est beaucoup plus verbeuse et moins lisible que la précédente et est destinée à des manipulations formelles par des programmes (éventuellement eux-mêmes écrits en XQuery).</li></ul>
<div class="mw-heading mw-heading2"><h2 id="Exemple">Exemple</h2></div>
<p>Soit le document XML suivant, situé à l'<a href="Rep%C3%A8re_uniforme_de_ressource" class="mw-redirect" title="Repère uniforme de ressource">URL</a> http://www.example.com/ et nommé exemple.xml :
</p>
<div class="mw-highlight mw-highlight-lang-xml mw-content-ltr" dir="ltr"><pre><span></span><span class="w"> </span><span class="nt"><employes></span>
<span class="w"> </span><span class="nt"><employe></span>
<span class="w"> </span><span class="nt"><nom></span>Durant<span class="nt"></nom></span>
<span class="w"> </span><span class="nt"><prenom></span>Albert<span class="nt"></prenom></span>
<span class="w"> </span><span class="nt"><date_naissance></span>23/09/1958<span class="nt"></date_naissance></span>
<span class="w"> </span><span class="nt"></employe></span>
<span class="w"> </span><span class="nt"><employe></span>
<span class="w"> </span><span class="nt"><nom></span>Dupont<span class="nt"></nom></span>
<span class="w"> </span><span class="nt"><prenom></span>Alphonse<span class="nt"></prenom></span>
<span class="w"> </span><span class="nt"><date_naissance></span>23/12/1975<span class="nt"></date_naissance></span>
<span class="w"> </span><span class="nt"></employe></span>
<span class="w"> </span><span class="nt"><employe></span>
<span class="w"> </span><span class="nt"><nom></span>Dupont<span class="nt"></nom></span>
<span class="w"> </span><span class="nt"><prenom></span>Isabelle<span class="nt"></prenom></span>
<span class="w"> </span><span class="nt"><date_naissance></span>12/03/1967<span class="nt"></date_naissance></span>
<span class="w"> </span><span class="nt"></employe></span>
<span class="w"> </span>...
<span class="w"> </span><span class="nt"></employes></span>
</pre></div>
<p>La requête FLWOR suivante :
</p>
<pre><b>for</b> $b <b>in</b> document ("http://example.com/exemple.xml")//employe
<b>where</b> $b/nom = "Dupont"
<b>return</b>
<dupont>{
$b/prenom,
$b/date_naissance
}</dupont>
</pre>
<p>va renvoyer le résultat suivant :
</p>
<div class="mw-highlight mw-highlight-lang-xml mw-content-ltr" dir="ltr"><pre><span></span><span class="w"> </span><span class="nt"><dupont></span>
<span class="w"> </span><span class="nt"><prenom></span>Alphonse<span class="nt"></prenom></span>
<span class="w"> </span><span class="nt"><date_naissance></span>23/12/1975<span class="nt"></date_naissance></span>
<span class="w"> </span><span class="nt"></dupont></span>
<span class="w"> </span><span class="nt"><dupont></span>
<span class="w"> </span><span class="nt"><prenom></span>Isabelle<span class="nt"></prenom></span>
<span class="w"> </span><span class="nt"><date_naissance></span>12/03/1967<span class="nt"></date_naissance></span>
<span class="w"> </span><span class="nt"></dupont></span>
</pre></div>
<div class="mw-heading mw-heading2"><h2 id="Composantes_du_langage">Composantes du langage</h2></div>
<p>XQuery est un langage spécifié de façon modulaire : le cœur du langage peut être augmenté par des modules optionnels.
</p>
<ul><li>Le langage minimal se base sur la norme <a href="XPath_2" class="mw-redirect" title="XPath 2">XPath 2</a> (qui spécifie le langage de requête XML proprement dit), augmentée par les principales fonctionnalités suivantes :
<ul><li>L'expression FLWOR (For Let Where Order by Return), une puissante instruction de boucle, avec de nombreuses fonctionnalités, qui est assez similaire au SELECT de SQL. Grâce au <b>where</b>, il est possible d'écrire des <a href="Jointure_(informatique)" title="Jointure (informatique)">jointures</a> internes ou externes. XQuery version 1.1 ajoute le <b>group by</b>, et le "fenêtrage" (possibilité de découper la séquence d'entrée selon des conditions booléennes). Il existe d'autres constructions telles que <b>if</b> et <b>typeswitch</b> qui peuvent se composer avec le FLWOR.</li>
<li>Les <i>constructeurs</i>, des instructions permettant de reconstruire des fragments XML, avec une syntaxe très proche de XML lui-même (un fragment <i>bien formé</i> de XML est de fait une expression XQuery valide). Ceci permet d'écrire des modèles (<i>templates</i>) comportant des expressions évaluées dynamiquement, à la manière des nombreux langages (exemple : <a href="PHP" title="PHP">PHP</a>) de génération de pages web.</li>
<li>Les fonctions définies par l'utilisateur.</li>
<li>Un ensemble de fonctions et opérateurs prédéfinis communs à XPath2, XQuery et XSLT 2.</li></ul></li></ul>
<p>Modules optionnels :
</p>
<ul><li>Le module optionnel <i>Full Axis</i> (Axes étendus) permet de bénéficier des "axes" de requête <i>ancestor, ancestor-or-self, following, following-sibling, preceding</i>, et <i>preceding-sibling</i> dans une expression XPath.</li>
<li>Les modules XQuery permettent d'importer des bibliothèques de fonctions ou de variables XQuery dans un programme XQuery.</li>
<li>Le module optionnel <i><span class="lang-en" lang="en">Schema Import</span></i> permet de spécifier les <a href="XML_Schema" title="XML Schema">schémas XML</a> auxquels répondent les données manipulées, permettant ainsi d'inférer les types de certaines expressions, et éventuellement d'optimiser les requêtes.</li>
<li>Le module optionnel <i><span class="lang-en" lang="en">Schema Validation</span></i> permet d'utiliser le mécanisme de validation de fragments XML par rapport à des schémas.</li>
<li>Le module optionnel "<a href="Typage_statique" title="Typage statique">Typage Statique</a>" supporte des vérifications de type avant exécution plus poussées.</li></ul>
<p>Extensions :
</p>
<ul><li><i><a href="XQuery_Update" title="XQuery Update">XQuery Update</a></i> est une norme en cours d'élaboration (norme préliminaire de 2010) étendant XQuery par des instructions de modification de nœuds XML : <code>insert node, delete node, rename node, replace node, replace value, copy/modify</code>.</li></ul>
<ul><li><i>XQuery Full-Text</i> est une extension en cours d'élaboration (norme préliminaire en 2008) spécifiant la recherche textuelle intégrée à XQuery. Elle permet la recherche <i>contextuelle</i> de mots et de phrases, c'est-à-dire restreinte par exemple au contenu d'un élément XML particulier.</li></ul>
<ul><li><i>XQuery Scripting</i>, en cours d'élaboration (Working Draft d'<time class="nowrap" datetime="2010-04" data-sort-value="2010-04">avril 2010</time>), modifie le modèle de programmation pour ajouter des instructions impératives (blocs séquentiels, <code>while</code>, <code>exit</code>) garantissant l'ordre d'exécution.</li></ul>
<div class="mw-heading mw-heading2"><h2 id="Caractéristiques_du_langage"><span id="Caract.C3.A9ristiques_du_langage"></span>Caractéristiques du langage</h2></div>
<ul><li>XQuery est un <a href="Langage_fonctionnel" class="mw-redirect" title="Langage fonctionnel">langage fonctionnel</a> (où toute construction retourne une valeur) donc sans <a href="Effet_de_bord_(informatique)" title="Effet de bord (informatique)">effet de bord</a>, c'est-à-dire ne modifiant pas directement les données sur lesquelles il travaille. XQuery Scripting est une exception à ce principe.</li>
<li>Contrairement à la plupart des langages fonctionnels, XQuery ne possède pas de fonctions de second ordre (pouvant être argument d'autres fonctions). Ceci change dans XQuery 1.1.</li>
<li>XQuery peut optionnellement être fortement typé (au sens des Schémas XML) à la compilation et à l'exécution.</li>
<li>Ces aspects sont partagés avec XSLT 2, qui est un langage proche de XQuery dans ses fonctionnalités.</li>
<li>La programmation en XQuery est en général d'un style plus "impératif" qu'en XSLT, c'est-à-dire qu'elle nécessite la connaissance <i>a priori</i> de la structure des données XML manipulées. Inversement XSLT spécifie de façon déclarative des traitements sur chaque type de nœuds XML, indépendamment les uns des autres. La programmation en XQuery est donc plus naturelle, mais un peu moins puissante et modulaire qu'en XSLT.</li>
<li>L'extension XQuery Scripting offre un modèle de programmation plus classique.</li></ul>
<div class="mw-heading mw-heading2"><h2 id="Modèle_de_données"><span id="Mod.C3.A8le_de_donn.C3.A9es"></span>Modèle de données</h2></div>
<ul><li>Toutes les valeurs manipulées par XQuery (ainsi que XPath2 et XSLT 2) sont des <i>séquences</i> (ou listes) d'<i>items</i>. Il n'y a pas de séquences imbriquées : une séquence de séquences est toujours "mise à plat".</li>
<li>Les items se répartissent en deux grands groupes :
<ul><li>les nœuds XML, qui eux-mêmes sont de six espèces différentes : document, élément, attribut, texte, commentaire, <i>processing-instruction</i>.</li>
<li>Les types de base (empruntés aux Schémas XML) au nombre de 48, comprenant notamment les types numériques (entiers, décimaux, flottants), les chaines de caractères et dérivés, les dates, instants et durées.</li></ul></li>
<li>Les types de bases peuvent être étendus par l'importation de Schémas (fonctionnalité optionnelle).</li></ul>
<p>Exemples :
</p>
<ul><li>L'expression <b>1 to 5</b> retourne la séquence d'items de type entier : <b>1 2 3 4 5</b>.</li>
<li>L'expression <b>for $i in 1 to 5 return $i * $i</b> retourne la séquence d'items de type entier : <b>1 4 9 16 25</b>.</li>
<li>L'expression <b>for $i in 1 to 3 return <X>{ $i }</X></b> retourne la séquence de nœuds éléments : <b><X>1</X> <X>2</X> <X>3</X></b>.</li>
<li>Une séquence n'est pas obligatoirement d'un type homogène. Par exemple l'expression <b>(1, 2), 2.5, (true(), "du texte")</b> retourne la séquence d'items <b>1 2 2.5 true() "du texte"</b> de types respectivement entier (2 fois), décimal, booléen, chaine de caractères.</li></ul>
<div class="mw-heading mw-heading2"><h2 id="Voir_aussi">Voir aussi</h2></div>
<div class="mw-heading mw-heading3"><h3 id="Articles_connexes">Articles connexes</h3></div>
<ul><li><a href="XPath" title="XPath">XPath</a></li>
<li><a href="XSLT" class="mw-redirect" title="XSLT">XSLT</a></li>
<li><a href="SPARQL" title="SPARQL">SPARQL</a>, langage de requête pour <a href="Resource_Description_Framework" title="Resource Description Framework">RDF</a></li>
<li><a href="Langage_de_transformation_XML" title="Langage de transformation XML">Langage de transformation XML</a></li></ul>
<div class="mw-heading mw-heading3"><h3 id="Implémentations"><span id="Impl.C3.A9mentations"></span>Implémentations</h3></div>
<ul><li><a href="BaseX" title="BaseX">BaseX</a>, <a href="Open_source" title="Open source">open source</a>. Requêtes <a rel="nofollow" class="external text" href="http://basex.org/products/live-demo/">en direct</a></li>
<li><a href="EXist" title="EXist">eXist</a>, open source.</li>
<li><abbr class="abbr indicateur-langue" title="Langue : anglais">(en)</abbr> <a rel="nofollow" class="external text" href="http://www.galaxquery.org/">Galax, implémentation en Ocaml</a></li>
<li><abbr class="abbr indicateur-langue" title="Langue : anglais">(en)</abbr> <a rel="nofollow" class="external text" href="http://www.qizx.com/">Qizx/open, interpréteur open source écrit en Java</a></li>
<li><abbr class="abbr indicateur-langue" title="Langue : anglais">(en)</abbr> <a rel="nofollow" class="external text" href="http://www.saxonica.com/">Saxon, processeur open source XQuery et XSLT 2</a>, réalisé par Michael Kay, concepteur de la norme XSLT 2.0.</li>
<li><abbr class="abbr indicateur-langue" title="Langue : anglais">(en)</abbr> <a rel="nofollow" class="external text" href="https://project.inria.fr/quix-tool-suite/quixquery/">QuiXQuery</a>, réalisé par Innovimax et INRIA écrit en Java.</li></ul>
<p>Le <a rel="nofollow" class="external text" href="http://www.w3.org/XML/Query/#implementations">portail XQuery du W3C</a> liste une cinquantaine d'implémentations de XQuery, open-source ou commerciales, ou de produits ou projets de recherche basés sur XQuery.
</p><p>Les <a href="Base_XML_native" class="mw-redirect" title="Base XML native">bases de données XML</a> natives supportant XQuery sont (en 2009) au nombre d'une quinzaine, dont environ le tiers sont open-source.
</p>
<div class="mw-heading mw-heading3"><h3 id="Liens_externes">Liens externes</h3></div>
<style data-mw-deduplicate="TemplateStyles:r194021218">
/* start https://fr.wikipedia.org/ */
.mw-parser-output .autres-projets>.titre{text-align:center;margin:0.2em 0}.mw-parser-output .autres-projets>ul{margin:0;padding:0}.mw-parser-output .autres-projets>ul>li{list-style:none;margin:0.2em 0;text-indent:0;padding-left:24px;min-height:20px;text-align:left;display:block}.mw-parser-output .autres-projets>ul>li>a{font-style:italic}@media(max-width:720px){.mw-parser-output .autres-projets{float:none}}
/* end https://fr.wikipedia.org/ */
</style>
<ul><li><abbr class="abbr indicateur-langue" title="Langue : anglais">(en)</abbr> <span class=" plainlinksneverexpand noarchive"><span class="lang-en" lang="en"><a class="external text" href="https://fr.wikibooks.org/wiki/en:XQuery"><i>XQuery Examples Collection</i></a></span>, sur Wikibooks</span> en anglais</li>
<li><abbr class="abbr indicateur-langue" title="Langue : anglais">(en)</abbr> <a rel="nofollow" class="external text" href="http://www.w3.org/TR/xquery/"><i>XQuery 1.0: <span class="lang-en" lang="en">An XML Query Language</span></i>, recommandation W3C, 23 janvier 2007</a></li>
<li><abbr class="abbr indicateur-langue" title="Langue : anglais">(en)</abbr> <a rel="nofollow" class="external text" href="http://www.w3.org/XML/Query/">Portail XQuery du W3C</a></li>
<li><abbr class="abbr indicateur-langue" title="Langue : anglais">(en)</abbr> <a rel="nofollow" class="external text" href="http://martinbroadhurst.com/open-source-xquery-implementations.html">Open Source XQuery Implementations</a></li></ul>
<ul id="bandeau-portail" class="bandeau-portail"><li><span class="bandeau-portail-element"><span class="bandeau-portail-icone"><span class="noviewer" typeof="mw:File"></span></span> <span class="bandeau-portail-texte">Portail de l’informatique</span> </span></li> <li><span class="bandeau-portail-element"><span class="bandeau-portail-icone"><span class="noviewer" typeof="mw:File"></span></span> <span class="bandeau-portail-texte">Portail du Web sémantique</span> </span></li> </ul></div><!--htdig_noindex--><div><div class="zim-footer">
Cet article est issu de <a class="external text" title="Dernière modification le 2023-09-27" href="https://fr.wikipedia.org/wiki/?title=XQuery&oldid=208245508">Wikipédia</a>. Sauf mention contraire, le texte est disponible sous <a class="external text" href="https://creativecommons.org/licenses/by-sa/4.0/deed.fr">Creative Commons Attribution-Share Alike 4.0</a>. Des conditions supplémentaires peuvent s’appliquer aux fichiers multimédias.
</div>
</div><!--/htdig_noindex--></div>
</div>
</main>
</div>
</div>
</div>
<script src="./_webp_/webpHandler.js"></script>
</body></html>